package com.twq.collection.framework

/**
 * Created by tangweiqun on 2017/11/15.
 */
object IterableTest {
  def main(args: Array[String]): Unit = {
    //1、trait Iterable提供了iterator方法，可以返回一个用来遍历集合元素的外部迭代器

    //2、iterator有两个方法，一个是hasNext，一个是next
    //如果集合中还有元素的话，则hasNext返回true，否则返回false
    //next返回下一个元素，如果没有下一个元素就会抛异常
    //Iterable的超类Traversable中的foreach方法的实现如下：
    /**
     * def foreach[U](f: Elem => U): Unit = {
     * val it = iterator
     * while (it.hasNext) f(it.next())
     * }
     */

    //3、Iterable另一个主要的优点是：有能力的高效的合作迭代两个集合
    val names = Iterable("kity", "myte")
    val ages = Iterable(32, 34)
    val n = names.iterator
    val a = ages.iterator
    while (n.hasNext && a.hasNext) {
      println(s"${n.next()} age is ${a.next()}")
    }

    //下面的代码效果和上面的是一样的
    names.iterator zip ages.iterator map { case
      (n, a) => s"${n} age is ${a}"
    } foreach println

    //4、当在可变集合中使用外部迭代器的时候，迭代器背后的集合可能在迭代器不知道的情况下改变了
    val x = collection.mutable.ArrayBuffer(1, 2, 3)
    val i = x.iterator
    //删除x中的所有元素
    x.remove(0, 3)
    i.hasNext //true
    i.next() //java.lang.IndexOutOfBoundsException: 0

    //5、Iterable应该用在明确需要外部迭代器，但不需要随机访问的应用场景

    //6、所有的方法
    val xs = Iterable(1, 2, 4, 2, 3)
    //抽象方法(Abstract Method)
    val iterator = xs.iterator
    while (iterator.hasNext) {
      println(iterator.next())
    }

    //Other Iterators
    xs.grouped(2) //res31: Iterator[Iterable[Int]] = Iterator(Iterable(1, 2), Iterable(4, 2), Iterable(3))
    xs.grouped(2).toList //res32: List[Iterable[Int]] = List(List(1, 2), List(4, 2), List(3))
    xs.sliding(2).toList //res35: List[Iterable[Int]] = List(List(1, 2), List(2, 4), List(4, 2), List(2, 3))

    //Subcollections
    xs.takeRight(3)
    xs.dropRight(3)

    //Zippers
    val ys = Iterable(3, 1, 1)
    xs.zip(ys)
    xs.zipAll(ys, 99, 999)
    xs.zipWithIndex

    //Comparison
    xs sameElements ys //false

  }
}
